package com.liaowei.system.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liaowei.common.Constants;
import com.liaowei.common.ErrorCode;
import com.liaowei.exception.CustomerException;
import com.liaowei.model.domain.Tag;
import com.liaowei.model.vo.TagVO;
import com.liaowei.system.mapper.TagMapper;
import com.liaowei.system.model.param.TagParam;
import com.liaowei.system.openfeign.ArticleClient;
import com.liaowei.system.openfeign.UserClient;
import com.liaowei.system.service.TagService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * @author LindaMan
 * @description 针对表【wy_tag(标签表)】的数据库操作Service实现
 * @createDate 2023-05-06 16:29:39
 */
@Service
@RequiredArgsConstructor
@Slf4j
public class TagServiceImpl extends ServiceImpl<TagMapper, Tag>
        implements TagService {

    private final TagMapper tagMapper;
    private final UserClient userClient;
    private final ArticleClient articleClient;



    /**
     * 根据id查询标签列表
     * @param tagIdList 标签id列表
     * @return List<Tag>
     */
    @Override
    public List<Tag> searchListByIds(List<Long> tagIdList) {
        if (tagIdList.size() == 0){
            return new ArrayList<>();
        }
        return this.listByIds(tagIdList);
    }

    /**
     * 根据标签id集合查询标签列表
     * @param tagIdList 标签id集合
     * @return 标签列表
     */
    @Override
    public Integer searchCountByIds(List<Long> tagIdList) {
        return tagMapper.selectTagCountByIds(tagIdList);
    }

    /**
     * 查询树状标签列表
     * @return TagVO列表
     */
    @Override
    public List<TagVO> treeList() {
        return Optional.ofNullable(tagMapper.selectTreeTagList()).orElse(new ArrayList<>());
    }

    /**
     * 根据id删除标签
     * @param id 标签id
     * @return 提示信息
     */
    @Transactional
    @Override
    public String deleteTagById(long id) {
        try {
            // 删除用户兴趣标签
            userClient.deleteUserTagByTagId(id);

            // 删除文章标签记录
            articleClient.deleteByTagId(id);

            // 删除标签
            tagMapper.deleteById(id);
        } catch (Exception e) {
            throw new CustomerException(ErrorCode.SYSTEM_ERROR);
        }

        return "删除成功";
    }

    /**
     * 保存标签
     *
     * @param tagParam 保存标签参数
     * @return 提示信息
     */
    @Transactional
    @Override
    public String saveTag(TagParam tagParam) {
        // 对父节点判断
        // 获取父节点
        Long parentId = tagParam.getParentId();
        // 查询所有父节点id，判断是否传入有效的父节点
        List<Long> parentIdList = tagMapper.selectParentIdList();
        // 数据库还未有该父节点数据，对传入的父节点进行判断，如果是0-插入父节点，非0-不合法
        if (!parentIdList.contains(parentId)) {
            // 判断parentId是否为0
            if (parentId != 0) {
                throw new CustomerException(Constants.PARAM_ERROR, "请输入有效父节点");
            }
        }

        // 对处理人判断 虽然只能管理员添加，但是防止管理员发请求其他用户id
        // 获取处理人id
        Long handler = tagParam.getHandler();
        // 查询所有用户，判断是否是管理员 - 管理员id为1
        if(handler != 1){
            throw new CustomerException(ErrorCode.NO_AUTHORITY);
        }

        // 保存数据
        try {
            // 判断是否有id
            Long id = tagParam.getId();
            Tag tag = new Tag();
            tag.setId(tagParam.getId());
            tag.setName(tagParam.getName());
            tag.setParentId(parentId);
            tag.setUpdateBy(handler);
            if (BeanUtil.isEmpty(id)) {
                // 无id，新增标签
                tag.setCreateBy(tagParam.getHandler());
                tagMapper.insert(tag);
            } else {
                // 有id
                // 校验id是否合法
                if (id < 1) {
                    // id不合法
                    throw new CustomerException(ErrorCode.PARAMS_ERROR);
                }
                // 修改标签
                tagMapper.updateById(tag);
            }
        } catch (CustomerException e) {
            if (e.getCode() == 40000){
                throw new CustomerException(Constants.PARAM_ERROR, "参数无效");
            }
            throw new CustomerException(ErrorCode.SYSTEM_ERROR);
        }

        // 返回提示信息
        return "保存成功";
    }
}




